package modelo.funciones;

import modelo.excepciones.ErrorDivisionPor0;
import modelo.excepciones.ValorNoPertenecienteAlDominio;
import modelo.funciones.Funcion;
import modelo.operaciones.OperacionEntreFunciones;
/**
 * Esta clase representa a las funciones f(x)=g(x)operacion h(x) .
 *
 * @version 	1.0 23 Oct 2007
 * @author 	 Grupo 3 Algoritmos III Cat.Fontela FIUBA
*/
public class FuncionCompuesta extends Funcion{
	
	private Funcion primerOperando;
	private Funcion segundoOperando;
	private OperacionEntreFunciones operacion;
	
	/**
	 * @param Funcion f,g son las funciones entre las cuales realizara 
	 * 		  la operacion. Seria f operacion g.
	 * 		  operacion es la Operacion a realizar entre las funciones		   
	*/
	public FuncionCompuesta(Funcion f,Funcion g,OperacionEntreFunciones operacion)
	{
		this.setPrimerOperando(f);
		this.setSegundoOperando(g);
		this.setOperacion(operacion);
	}
	/**
	 * @param valor double en el cual se quiere evalua la funcion.	
	 * @return Un double que es el resultado de evaluar la funcion en valor 
	 * @throws ErrorDivisionPor0 Arroja esta excepcion si la operacion a realizar
	 * 	es una division y el valor retornado por la funcion que sera divisor es 0.
	 * 	ValorNoPertenecienteAlDominio Arroja esta excepcion si el valor
	 * 	a evaluar en cualquiera de las funciones no pertenece al dominio.		   
	*/
	public double evaluar(double valor) throws ErrorDivisionPor0, ValorNoPertenecienteAlDominio{
		return this.getOperacion().aplicar(this.getPrimerOperando(),this.getSegundoOperando(),valor);
	}
	public Funcion aplicarOperacion(OperacionEntreFunciones op, Funcion func) {
		return new FuncionCompuesta(this,func,op);
	}
	private void setSegundoOperando(Funcion f)
	{
		this.segundoOperando=f;
	}
	
	private void setOperacion(OperacionEntreFunciones operacion)
	{
		this.operacion=operacion;
	}
	
	private Funcion getSegundoOperando()
	{
		return segundoOperando;
	}
	
	private OperacionEntreFunciones getOperacion()
	{
		return operacion;
	}
	
	 
	/**
	 * Getter of the property <tt>primerOperando</tt>
	 *
	 * @return Returns the primerOperando.
	 * 
	 */
	private Funcion getPrimerOperando()
	{
		return primerOperando;
	}
	
	/**
	 * Setter of the property <tt>primerOperando</tt>
	 *
	 * @param primerOperando The primerOperando to set.
	 *
	 */
	private void setPrimerOperando(Funcion primerOperando ){
		this.primerOperando = primerOperando;
	}
}
